package opf5.entities.repositorios;

import java.util.List;

import opf5.entities.Equipos.EquipoConcreto;
import opf5.entities.calificaciones.CalificacionConcreta;
import opf5.entities.dominio.Calificacion;
import opf5.entities.dominio.Equipo;
import opf5.entities.dominio.Infraccion;
import opf5.entities.dominio.Inscripcion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.dominio.Propuesta;
import opf5.entities.infracciones.InfraccionConcreta;
import opf5.entities.inscripciones.CondicionDeInscripcion;
import opf5.entities.inscripciones.InscripcionCondicional;
import opf5.entities.inscripciones.InscripcionEstandar;
import opf5.entities.inscripciones.InscripcionSolidaria;
import opf5.entities.jugadores.JugadorConcreto;
import opf5.entities.notificaciones.PartidoNotificadorCompletoDecorator;
import opf5.entities.notificaciones.PartidoNotificadorIncompletoDecorator;
import opf5.entities.notificaciones.PartidoNotificadorInscripcionDecorator;
import opf5.entities.partidos.PartidoConcreto;
import opf5.entities.propuestas.PropuestaConcreta;
import opf5.persistencia.OPF5DBGateway;
import opf5.persistencia.proxies.CalificacionDBProxy;
import opf5.persistencia.proxies.EquipoDBProxy;
import opf5.persistencia.proxies.InfraccionDBProxy;
import opf5.persistencia.proxies.InscripcionDBProxy;
import opf5.persistencia.proxies.JugadorDBProxy;
import opf5.persistencia.proxies.PartidoDBProxy;
import opf5.persistencia.proxies.PropuestaDBProxy;
import opf5.utilidades.EnviadorDeEmail;
import opf5.utilidades.EnviadorDeEmailImprimir;
import opf5.utilidades.Fecha;
import opf5.utilidades.MockEnviadorDeEmail;

public class OPF5FactoryPersistente extends OPF5Factory {
	public static void setInstance() {
		if (instance == null) {
			instance = new OPF5FactoryPersistente();
		}
	}
	
	@Override
	public Inscripcion makeInscripcion(Jugador jugador, String tipoInscripcion) {
		if (tipoInscripcion.equals("Estandar")) {
			return OPF5Factory.getInstance().makeInscripcionEstandar(jugador);
		} else if (tipoInscripcion.equals("Solidaria")) {
			return OPF5Factory.getInstance().makeInscripcionSolidaria(jugador);
		}
		
		return OPF5Factory.getInstance().makeInscripcionCondicional(jugador);
	}

	@Override
	public Jugador makeJugador(String nombre, String email, Fecha fecha) {
		JugadorDBProxy jugador = new JugadorDBProxy(
				new JugadorConcreto(nombre, email, fecha));
		
		OPF5DBGateway.crearJugador(jugador);
		
		return jugador;
	}

	@Override
	public Propuesta makePropuesta(String nombreJugadaorPropuesto,
			Jugador jugador) {
		
		return new PropuestaDBProxy(new PropuestaConcreta(nombreJugadaorPropuesto, jugador));
	}

	@Override
	public Partido makePartido(Fecha fecha, String lugar) {
		Partido partido = new PartidoConcreto(fecha, lugar);
		
		Jugador admin = new JugadorConcreto("admin", "admin@opf5.com", new Fecha());
		
		EnviadorDeEmail enviador = new EnviadorDeEmailImprimir();
		
		partido = new PartidoNotificadorCompletoDecorator(partido, enviador, admin);
		partido = new PartidoNotificadorIncompletoDecorator(partido, enviador, admin);
		partido = new PartidoNotificadorInscripcionDecorator(partido, enviador);
		
		PartidoDBProxy partidodb = new PartidoDBProxy(partido);
		OPF5DBGateway.crearPartido(partidodb);
		return partidodb;
	}

	@Override
	public Equipo makeEquipo(List<Jugador> equipo) {
		EquipoDBProxy equipodb = new EquipoDBProxy(new EquipoConcreto(equipo));
		return equipodb;
	}

	@Override
	public Inscripcion makeInscripcionCondicional(Jugador jugador) {
		InscripcionDBProxy inscripciondb = new InscripcionDBProxy(new InscripcionCondicional(jugador));
		return inscripciondb;
	}

	@Override
	public Inscripcion makeInscripcionEstandar(Jugador jugador) {
		InscripcionDBProxy inscripciondb = new InscripcionDBProxy(new InscripcionEstandar(jugador));
		return inscripciondb;
	}

	@Override
	public Inscripcion makeInscripcionSolidaria(Jugador jugador) {
		InscripcionDBProxy inscripciondb = new InscripcionDBProxy(new InscripcionSolidaria(jugador));
		return inscripciondb;
	}

	@Override
	public Infraccion makeInfraccion(Fecha fecha, String motivo) {
		InfraccionDBProxy infraccion = new InfraccionDBProxy(
				new InfraccionConcreta(fecha, motivo));
		
		return infraccion;
	}

	@Override
	public Calificacion makeCalificacion(Jugador jugadorCalificador, Partido partido,
			int nota, String comentario) {
		CalificacionDBProxy calificacion = new CalificacionDBProxy(
				new CalificacionConcreta(jugadorCalificador, partido, nota, comentario));
		
		return calificacion;
	}
	
	@Override
	public Inscripcion makeInscripcionCondicional(Jugador jugador, CondicionDeInscripcion condicion) {
		InscripcionDBProxy inscripciondb = new InscripcionDBProxy(new InscripcionCondicional(jugador, condicion));
		return inscripciondb;
	}
}
